package com.dingding.nettyserver.core.scanner;

import java.util.HashMap;
import java.util.Map;


/**
 * <p>命令执行器管理者
 * 
 * <p>收集所有命令执行器{@link Invoker},并封装到本类中的Map集合中并以业务类型，模块号，命令号
 * 同时作为Map的key
 * 
 * @author fengshuonan
 *
 */
public class InvokerHoler {

	/** 命令调用器 */
	private static Map<Byte, Map<Short, Map<Short, Invoker>>> invokers = new HashMap<Byte, Map<Short, Map<Short, Invoker>>>();
	
	/**
	 * @Description 添加命令执行器
	 * @author fengshuonan
	 * @param bizType 业务类型（顺风车，出租车，还是专车）
	 * @param module 模块号（例如：用户模块）
	 * @param cmd 命令号（例如：用户登录）
	 * @param invoker 具体命令执行器
	 */
	public static void addInvoker(byte bizType, short module, short cmd, Invoker invoker) {
		Map<Short, Map<Short, Invoker>> modularMap = invokers.get(bizType);
		if(modularMap == null){
			modularMap = new HashMap<Short, Map<Short, Invoker>>();
			Map<Short, Invoker> cmdMap = new HashMap<Short, Invoker>();
			cmdMap.put(cmd,invoker);
			modularMap.put(module, cmdMap);
			invokers.put(bizType, modularMap);
		}else{
			Map<Short, Invoker> cmdMap = modularMap.get(module);
			if(cmdMap == null){
				cmdMap = new HashMap<Short, Invoker>();
				cmdMap.put(cmd, invoker);
				modularMap.put(module, cmdMap);
			}else{
				cmdMap.put(cmd, invoker);
			}
		}
	}

	/**
	 * @Description 获取命令执行器
	 * @author fengshuonan
	 * @param bizType 业务类型（顺风车，出租车，还是专车）
	 * @param module 模块号（例如：用户模块）
	 * @param cmd 命令号（例如：用户登录）
	 */
	public static Invoker getInvoker(byte bizType,short module, short cmd) {
		Map<Short, Map<Short, Invoker>> moduleMap = invokers.get(bizType);
		if(moduleMap == null){
			return null;
		}else{
			Map<Short, Invoker> cmdMap = moduleMap.get(module);
			if(cmdMap == null){
				return null;
			}else{
				Invoker invoker = cmdMap.get(cmd);
				if(invoker == null){
					return null;
				}else{
					return invoker;
				}
			}
		}
	}
	
}
